/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.primefaces.event.ToggleEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKOrdenServicioSeg;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.KardexPK;
import pe.com.cotelasa.scp.entidad.MaterialConsumido;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.to.LiquidacionTO;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBOrdenServicioSeg")
@Scope("request")
public class MBOrdenServicioSeg extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBOrdenCompra.class);
    @Inject
    private BKOrdenServicioSeg bkOrdenServicioSeg;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Inject
    private IServicioKardex servicioKardex;
    @Autowired
    BKSession session;

    public MBOrdenServicioSeg() {
    }

    public String mostrarSeguimiento() {
        try {
            bkOrdenServicioSeg.inicializarValores();
            this.bkOrdenServicioSeg.setOrdenServicioSeg(servicioOrdenCS.conseguirOrdenCompraServicioPorId(this.bkOrdenServicioSeg.getOrdenServicioSeg().getId()));
            OrdenCompraServicio orden = this.bkOrdenServicioSeg.getOrdenServicioSeg();
            //int catDetalles = orden.getDetalleOrdenCompraServicioCollection().size();
            int cantidadGuias = orden.getGuiaRemisionCollection().size();
            if (cantidadGuias > 0 && orden.getEstadoOrden().equals("" + OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor())) {
                List<GuiaRemision> lista = (List<GuiaRemision>) orden.getGuiaRemisionCollection();
                cantidadGuias--;
                while (cantidadGuias >= 0) {
                    GuiaRemision guia = lista.get(cantidadGuias);
                    if (guia.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                            && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                        this.bkOrdenServicioSeg.getOrdenServicioSeg().setFechaCierre(guia.getFechaInicioTraslado());
                        break;
                    }
                    cantidadGuias--;
                }

            }

            for (DetalleOrdenCompraServicio detalle : this.bkOrdenServicioSeg.getOrdenServicioSeg().getDetalleOrdenCompraServicioCollection()) {
                if (detalle.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    this.bkOrdenServicioSeg.getListaDetalleOCS().add(detalle);
                    detalle.setTotalRecibido(calcularTotales(detalle));
                }
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.OrdenCompraServicio.URL_SEGUIMIENTO_ORDEN_SERVICIO;
    }

    public BigDecimal calcularTotales(DetalleOrdenCompraServicio detalle) {
        BigDecimal cantidad = BigDecimal.ZERO;

        OrdenCompraServicio orden = this.bkOrdenServicioSeg.getOrdenServicioSeg();

        if (orden.getGuiaRemisionCollection().size() > 0) {
            for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
                if (guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())
                        && guia.getParametroTipoGuia().getId() == Constantes.TipoGuiaRemision.GUIA_ENTRADA) {
                    for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                        System.out.println("estado de registro: " + detalleGR.getEstadoRegistro());
                        System.out.println("estado de guia: " + guia.getEstadoGuia());
                        System.out.println("detalle: " + detalleGR.getDetalleOrdenCompraServicio());
                        if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                                && detalleGR.getArticulo().getId().equals(detalle.getIdArticulo().getId())) {
                            cantidad = cantidad.add(detalleGR.getCantidad());
                        }
                    }
                }

            }
        }

        return cantidad;
    }

    public String cerrarOrden() {
        try {
            bkOrdenServicioSeg.getOrdenServicioSeg().setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.CERRADO.getValor());
            bkOrdenServicioSeg.getOrdenServicioSeg().setUsrModificacion(session.getUsuario().getUsuario());
            bkOrdenServicioSeg.getOrdenServicioSeg().setFecModificacion(new Date());
            servicioOrdenCS.actualizarOrdenCompraServicio(bkOrdenServicioSeg.getOrdenServicioSeg());
            mostrarMensaje("Se Finalizó la Orden de Servicio " + bkOrdenServicioSeg.getOrdenServicioSeg().getCodigo() + " con éxito.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return mostrarSeguimiento();
    }

    public String anularOrden() {
        try {
            bkOrdenServicioSeg.getOrdenServicioSeg().setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor());
            bkOrdenServicioSeg.getOrdenServicioSeg().setUsrModificacion(session.getUsuario().getUsuario());
            bkOrdenServicioSeg.getOrdenServicioSeg().setFecModificacion(new Date());
            servicioOrdenCS.actualizarOrdenCompraServicio(bkOrdenServicioSeg.getOrdenServicioSeg());
            mostrarMensaje("Se Anuló la Orden de Servicio " + bkOrdenServicioSeg.getOrdenServicioSeg().getCodigo() + " con éxito.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return mostrarSeguimiento();
    }

    public void verDetalleEntrada(ToggleEvent event) {
        DetalleOrdenCompraServicio detalle = (DetalleOrdenCompraServicio) event.getData();
        try {
            OrdenCompraServicio orden = servicioOrdenCS.conseguirOrdenCompraServicioPorId(this.bkOrdenServicioSeg.getOrdenServicioSeg().getId());
            //int catDetalles = orden.getDetalleOrdenCompraServicioCollection().size();
            this.bkOrdenServicioSeg.getListaDetalleGREntrada().clear();
            System.out.println("---------------------- detalle de orden : " + detalle);
            System.out.println("---------------------- lista de guias : " + orden.getGuiaRemisionCollection());
            if (orden.getGuiaRemisionCollection().size() > 0) {
                for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
                    System.out.println("---------------------- entro: " + guia);

                    System.out.println("---------------------- parametro 1: " + guia.getParametroTipoGuia().getId());
                    System.out.println("---------------------- parametro 2: " + Constantes.TipoGuiaRemision.GUIA_ENTRADA);

                    if (guia.getParametroTipoGuia().getId().equals(Constantes.TipoGuiaRemision.GUIA_ENTRADA)
                            && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                        for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                            System.out.println("unidad medida 1 : " + detalleGR.getTipoUnidadMinima().getAbrev());
                            System.out.println("---------------------- detalle gr : " + detalleGR);

                            System.out.println("---------------------- detalle 1: " + detalleGR.getDetalleOrdenCompraServicio());
                            System.out.println("---------------------- detalle 2: " + detalle);
                            if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                                    && detalle.getIdArticulo().getId().equals(detalleGR.getArticulo().getId())) {

                                System.out.println("unidad medida 2 : " + detalleGR.getTipoUnidadMinima().getAbrev());
                                this.bkOrdenServicioSeg.getListaDetalleGREntrada().add(detalleGR);

                            }
                        }

                    }
                }
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void mostrarLiquidacionComposicion() {
        try {
            bkOrdenServicioSeg.setListaLiquidaciones(new ArrayList<LiquidacionTO>());
            Kardex kardexB = new Kardex();
            kardexB.setId(new KardexPK(session.getEmpresa().getId(), 0, 0, 0, ""));
            kardexB.setIdGuiaRemision(new GuiaRemision());
            kardexB.getIdGuiaRemision().setIdOrdenCompraServicio(bkOrdenServicioSeg.getCurrentDetalleOCS().getIdOrdenCompraServicio());

            Collection<Kardex> listaKardex = servicioKardex.listaKardexPorFiltro(kardexB, null, null);
            System.out.println(bkOrdenServicioSeg.getCurrentDetalleOCS().getIdArticulo().getNombreComercial());
            System.out.println(">>>>>>>>>>>>>>>> lista de kardex: " + listaKardex);

            bkOrdenServicioSeg.getCurrentDetalleOCS().setIdArticulo(servicioArticulo.conseguirArticuloPorId(bkOrdenServicioSeg.getCurrentDetalleOCS().getIdArticulo().getId()));
            System.out.println(">>>>>>>>>>>>>>>> lista de composicion: " + bkOrdenServicioSeg.getCurrentDetalleOCS().getIdArticulo().getComposicionArticuloCollection());
            for (ComposicionArticulo comp : bkOrdenServicioSeg.getCurrentDetalleOCS().getIdArticulo().getComposicionArticuloCollection()) {
                boolean encontrado = false;
                BigDecimal cantidadEntrada = BigDecimal.ZERO;
                BigDecimal cantidadDevuelta = BigDecimal.ZERO;
                Iterator itr = listaKardex.iterator();
                System.out.println(" " + comp.getIdArticuloComp().getNombreComercial());
                while (itr.hasNext()) {

                    Kardex kardex = (Kardex) itr.next();

                    if (comp.getIdArticuloComp().getId().equals(kardex.getArticulo().getId())
                            && kardex.getEstadoRegistro().equals(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()))) {
                        if (kardex.getTiMovimiento().equals(Constantes.TipoMovimiento.SALIDA)) {
                            System.out.println(">>>>>>>>>>>>>>>> entrooooooooo a sumar cant entrada: ");
                            encontrado = true;
                            cantidadEntrada = cantidadEntrada.subtract(kardex.getCaMovimiento());

                        } else {

                            cantidadDevuelta = cantidadDevuelta.add(kardex.getCaMovimiento());

                        }

                        itr.remove();
                    }
                }

                if (encontrado) {
                    LiquidacionTO liquidacion = new LiquidacionTO();
                    liquidacion.setIdArticulo(comp.getIdArticuloComp().getId());
                    liquidacion.setNomArticulo(comp.getIdArticuloComp().getNombreComercial());
                    liquidacion.setMerma(BigDecimal.ZERO);
                    liquidacion.setPorcMerma(BigDecimal.ZERO);
                    liquidacion.setMatIngresado(cantidadEntrada);
                    liquidacion.setDevolucion(cantidadDevuelta);
                    liquidacion.setCantComp(comp.getCantidad());
                    liquidacion.setSimbComp(comp.getTipo());
                    BigDecimal cantidadSalida = BigDecimal.ZERO;
                    encontrado = false;

                    for (GuiaRemision guia : servicioOrdenCS.conseguirOrdenCompraServicioPorId(bkOrdenServicioSeg.getOrdenServicioSeg().getId()).getGuiaRemisionCollection()) {
                        System.out.println("---------------------- entro: " + guia);

                        System.out.println("---------------------- parametro 1: " + guia.getParametroTipoGuia().getId());
                        System.out.println("---------------------- parametro 2: " + Constantes.TipoGuiaRemision.GUIA_ENTRADA);

                        if (guia.getParametroTipoGuia().getId().equals(Constantes.TipoGuiaRemision.GUIA_ENTRADA)
                                && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                            for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {

                                if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                                    for (MaterialConsumido material : detalleGR.getMaterialCunsumidoCollection()) {
                                        System.out.println("---------------------- art 1: " + material.getIdArticulo());
                                        System.out.println("---------------------- art 2: " + comp.getIdArticuloComp());
                                        if (comp.getIdArticuloComp() == material.getIdArticulo()) {
                                            System.out.println(">>>>>>>>>>>>>>>> entrooooooooo a sumar can salida: ");
                                            encontrado = true;
                                            cantidadSalida = cantidadSalida.add(material.getCantidadConsumida());
                                        }
                                    }
                                    this.bkOrdenServicioSeg.getListaDetalleGREntrada().add(detalleGR);

                                }
                            }

                        }
                    }

                    if (encontrado) {
                        System.out.println("cantidadSalida = " + cantidadSalida);
                        liquidacion.setMatUsado(cantidadSalida);
                        liquidacion.setSaldo(liquidacion.getMatIngresado().subtract(liquidacion.getMatUsado()).subtract(liquidacion.getDevolucion()));

                    } else {
                        liquidacion.setMatUsado(BigDecimal.ZERO);
                        liquidacion.setSaldo(BigDecimal.ZERO);
                    }

                    bkOrdenServicioSeg.getListaLiquidaciones().add(liquidacion);
                }
                System.out.println(">>>>>>>>>>>>>>>> lista final: " + bkOrdenServicioSeg.getListaLiquidaciones());
                if (listaKardex.isEmpty()) {
                    break;
                }
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

    }

    public void verDetalleSalida(ToggleEvent event) {
        try {
            LiquidacionTO detalle = (LiquidacionTO) event.getData();
            Articulo arti = servicioArticulo.conseguirArticuloPorId(detalle.getIdArticulo());
            OrdenCompraServicio orden = this.bkOrdenServicioSeg.getOrdenServicioSeg();
            //int catDetalles = orden.getDetalleOrdenCompraServicioCollection().size();
            this.bkOrdenServicioSeg.getListaDetalleGRSalida().clear();
            if (orden.getGuiaRemisionCollection().size() > 0) {
                for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
                    guia = servicioGuia.conseguirGuiaDeRemisionPorId(guia.getId());

                    if (guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {

                        for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                            if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                                    && detalleGR.getArticulo().getId().equals(arti.getId())) {
                                this.bkOrdenServicioSeg.getListaDetalleGRSalida().add(detalleGR);

                            }
                        }

                    }
                }
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void reporteOrdenServicioLiquidacion() throws IOException, ServiceException {
        OrdenCompraServicio orden = servicioOrdenCS.conseguirOrdenCompraServicioPorId(bkOrdenServicioSeg.getOrdenServicioSeg().getId());


        //Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("d:/ChartSample.xlsx"))); // or sample.xls
        HSSFWorkbook wb = new HSSFWorkbook();
        //HSSFSheet sheet = wb.createSheet("Cotizaciones");
        HSSFSheet sheet = wb.createSheet("Orden Servicio");

        sheet.setAutobreaks(true);
        sheet.setDefaultColumnWidth(10);
        sheet.setAlternativeFormula(true);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont cabFont = wb.createFont();
        //cabFont.setColor(HSSFColor.RED.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("9"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.setFont(cabFont);

        /**
         * ***** fuente para titulos ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("7"));

        /**
         * ***** fuente para titulos ******************
         */
        HSSFFont artFont = wb.createFont();
        artFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        artFont.setFontHeightInPoints(Short.valueOf("8"));


        HSSFCellStyle artStyle = wb.createCellStyle();
        artStyle.setFont(artFont);
        //artStyle.setFontHeightInPoints(Short.valueOf("9"));



        /**
         * ***** fuente para Contenido ******************
         */
        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle contStyle = wb.createCellStyle();
        contStyle.setFont(contFont);
        contStyle.setWrapText(true);

        /**
         * ***** fuente para Contenido numerico ******************
         */
        HSSFCellStyle cantStyle = wb.createCellStyle();
        cantStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        cantStyle.setFont(contFont);

        /**
         * ***** fuente para generado por ******************
         */
        HSSFFont genFont = wb.createFont();
        genFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        genFont.setFontHeightInPoints(Short.valueOf("9"));


        HSSFCellStyle genStyle = wb.createCellStyle();
        genStyle.setFont(genFont);
        genStyle.setWrapText(true);

        Short[] listaColores = {HSSFColor.GREY_25_PERCENT.index,
            HSSFColor.PALE_BLUE.index,
            HSSFColor.LIGHT_GREEN.index,
            HSSFColor.CORAL.index,
            HSSFColor.LEMON_CHIFFON.index};


        HSSFRow rowCab = sheet.createRow(0);

        HSSFCell cellCab0 = rowCab.createCell(1);
        cellCab0.setCellStyle(cabStyle);
        //String tipo = orden.getIdOrdenPedido().getTipoOp() == 'T' ? "TELA" : "PRENDA";
        cellCab0.setCellValue("Liquidación de Orden de " + orden.getServicio() + " : " + orden.getCodigo());

        CellRangeAddress region = new CellRangeAddress(0, 0, 1, 5);
        /*RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, region, sheet, wb);
         RegionUtil.setBorderTop(CellStyle.BORDER_THIN, region, sheet, wb);*/
        sheet.addMergedRegion(region);


        HSSFRow row = sheet.createRow(1);

        int rowCot = 2;
        int cellCot = 0;
        int c = 0;
        for (DetalleOrdenCompraServicio detalle : this.bkOrdenServicioSeg.getOrdenServicioSeg().getDetalleOrdenCompraServicioCollection()) {
            if (detalle.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                detalle.setTotalRecibido(calcularTotales(detalle));

                row = sheet.createRow(rowCot);
                HSSFCell cell = row.createCell(cellCot);
                cell.setCellValue(detalle.getIdArticulo().getNombreComercial());
                cell.setCellStyle(artStyle);

                region = new CellRangeAddress(rowCot, rowCot, cellCot, (cellCot + 4));

                RegionUtil.setBorderBottom(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                RegionUtil.setBorderTop(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                rowCot += 2;

                for (int l = rowCot; l <= rowCot + 5; l++) {
                    row = sheet.createRow(l);
                }

                bkOrdenServicioSeg.setCurrentDetalleOCS(detalle);
                mostrarLiquidacionComposicion();

                HSSFCellStyle titStyle = wb.createCellStyle();
                titStyle.cloneStyleFrom(borderStyle);
                if (c >= 5) {
                     c-=5;
                    titStyle.setFillForegroundColor(listaColores[c]);
                } else {
                    titStyle.setFillForegroundColor(listaColores[c]);
                }
                titStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                titStyle.setFont(titFont);

                for (LiquidacionTO liq : bkOrdenServicioSeg.getListaLiquidaciones()) {

                    row = sheet.getRow(rowCot);
                    cell = row.createCell(cellCot);
                    cell.setCellValue(liq.getNomArticulo() + " (" + liq.getCantComp() + liq.getSimbComp() + ")");
                    cell.setCellStyle(titStyle);

                    region = new CellRangeAddress(rowCot, rowCot, cellCot, (cellCot + 2));

                    RegionUtil.setBorderBottom(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                    RegionUtil.setBorderTop(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                    RegionUtil.setBorderLeft(CellStyle.BORDER_MEDIUM, region, sheet, wb);
                    RegionUtil.setBorderRight(CellStyle.BORDER_MEDIUM, region, sheet, wb);

                    sheet.addMergedRegion(region);

                    row = sheet.getRow(rowCot + 1);
                    cell = row.createCell(cellCot);
                    cell.setCellStyle(contStyle);
                    cell.setCellValue("MATERIAL INGRESADO");

                    cell = row.createCell(cellCot + 2);
                    cell.setCellStyle(cantStyle);
                    cell.setCellValue(liq.getMatIngresado().floatValue());

                    row = sheet.getRow(rowCot + 2);
                    cell = row.createCell(cellCot);
                    cell.setCellStyle(contStyle);
                    cell.setCellValue("MATERIAL USADO");

                    cell = row.createCell(cellCot + 2);
                    cell.setCellStyle(cantStyle);
                    cell.setCellValue(liq.getMatUsado().floatValue());

                    row = sheet.getRow(rowCot + 3);
                    cell = row.createCell(cellCot);
                    cell.setCellStyle(contStyle);
                    cell.setCellValue("DEVOLUCION");

                    cell = row.createCell(cellCot + 2);
                    cell.setCellStyle(cantStyle);
                    cell.setCellValue(liq.getDevolucion().floatValue());

                    row = sheet.getRow(rowCot + 4);
                    cell = row.createCell(cellCot);
                    cell.setCellStyle(contStyle);
                    cell.setCellValue("MERMA");

                    cell = row.createCell(cellCot + 1);
                    cell.setCellStyle(contStyle);
                    cell.setCellValue(liq.getPorcMerma() + "%");

                    cell = row.createCell(cellCot + 2);
                    cell.setCellStyle(cantStyle);
                    cell.setCellValue(liq.getMerma().floatValue());

                    row = sheet.getRow(rowCot + 5);
                    cell = row.createCell(cellCot);
                    cell.setCellStyle(contStyle);
                    cell.setCellValue("SALDO");

                    cell = row.createCell(cellCot + 2);
                    cell.setCellStyle(cantStyle);
                    cell.setCellValue(liq.getSaldo().floatValue());

                    cellCot += 3;
                }
                cellCot = 0;
                rowCot += 7;
                c++;
            }
        }

        rowCot++;

        /*HSSFRow rowGU = sheet.createRow(rowCot + 2);

         HSSFCell cellGU0 = rowGU.createCell(0);
         cellGU0.setCellStyle(genStyle);
         cellGU0.setCellValue("Generado por:");

         HSSFCell cellGU1 = rowGU.createCell(1);
         cellGU1.setCellStyle(genStyle);
         cellGU1.setCellValue(session.getUsuario().getNombres() + " " + session.getUsuario().getApellidos());

         HSSFRow rowGF = sheet.createRow(rowCot + 3);

         HSSFCell cellGF0 = rowGF.createCell(0);
         cellGF0.setCellStyle(genStyle);
         cellGF0.setCellValue("Fecha:");

         HSSFCell cellGF1 = rowGF.createCell(1);
         cellGF1.setCellStyle(genStyle);
         cellGF1.setCellValue(UtilitarioFecha.formatearFecha(new Date(), "dd/MM/yyyy"));*/

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"LiquidacionOrdenServicio.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();

    }
}
